home *** CD-ROM | disk | FTP | other *** search
/ Practical Algorithms for Image Analysis / Practical Algorithms for Image Analysis.iso / CH_5.7 / XSGLL / PRLPAR.C < prev    next >
C/C++ Source or Header  |  1999-09-11  |  2KB  |  75 lines

  1. /* 
  2.  * prlpar.c
  3.  * 
  4.  * Practical Algorithms for Image Analysis
  5.  * 
  6.  * Copyright (c) 1997, 1998, 1999 MLMSoftwareGroup, LLC
  7.  */
  8.  
  9. /* PRLPAR:      function returns distance and overlaps between 2
  10.  *            nearly parallel lines
  11.  *                      usage: prlpar (ptO1, ptF1, ptO2, ptF2, 
  12.  *                                              &dist12, &dist21,
  13.  *                                              &overlap12, &overlap21)
  14.  */
  15.  
  16. #include <math.h>
  17. #include <stdlib.h>
  18. #include "lldef.h"
  19. #include "xsgll.h"
  20.  
  21.  
  22.  
  23. #define OVERLAP 1               /* overlap exists */
  24. #define NOOVERLAP 0             /* no overlap exists */
  25. #define PERPENDICULAR -1        /* no nothing: lines are perpend. */
  26.  
  27. //#define ABS(A) (((A) > 0.0) ? (A): -(A))              /* absolute value */
  28.  
  29.  
  30.  
  31. /*
  32.  * evaluate (normalized) overlaps 12 and 21, as well as distances d12, d21
  33.  */
  34. void
  35. prlpar (ptO1, ptF1, ptO2, ptF2, dist12, dist21, overlap12, overlap21)
  36.      struct spoint ptO1,        /* initial and final pts of line 1 */
  37.        ptF1, ptO2,              /* initial and final pts of line 2 */
  38.        ptF2;
  39.  
  40.      double *dist12,            /* perpendic. dist. between lines */
  41.       *dist21, *overlap12,      /* overlap between line segments */
  42.       *overlap21;
  43.  
  44. {
  45.  
  46.   register int defined12,       /* 1 = overlap; 0 = none */
  47.     defined21;
  48.  
  49.   register double minDist,      /* min. dist. between lines */
  50.     absDist12,                  /* absolute values of distances */
  51.     absDist21;
  52.  
  53. /* find distance and overlap from line 1 to 2 and 2 to 1 */
  54.   defined12 = parallelpar (ptO1, ptF1, ptO2, ptF2, dist12, overlap12);
  55.   defined21 = parallelpar (ptO2, ptF2, ptO1, ptF1, dist21, overlap21);
  56.  
  57. /* make the distance equal to the minimum valid distance between lines */
  58.  
  59.   absDist12 = ABS (*dist12);
  60.   absDist21 = ABS (*dist21);
  61.   if (defined12 == OVERLAP && defined21 == OVERLAP) {
  62.     minDist = (absDist12 < absDist21) ? absDist12 : absDist21;
  63.     *dist12 = (*dist12 >= 0.0) ? minDist : -minDist;
  64.     *dist21 = (*dist21 >= 0.0) ? minDist : -minDist;
  65.   }
  66.   else if (defined12 == OVERLAP) {
  67.     *dist21 = (*dist21 >= 0.0) ? absDist12 : -absDist12;
  68.   }
  69.   else if (defined21 == OVERLAP) {
  70.     *dist12 = (*dist12 >= 0.0) ? absDist21 : -absDist21;
  71.   }
  72.   else
  73.     *dist12 = *dist21 = 0.0;
  74. }
  75.